package com.cskaoyan.javase.oop2._2polymorphic._0introduction;

/**
 * @description: 多态的引入
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 多态: 指的是同种事物在不同情况下,显示出不同的状态
 * 在java当中:
 *      同种事物: 同一个引用(父类引用)
 *      不同情况: 指向不同的对象(子类对象)
 *      不同状态: 调用同名方法,行为不同
 * 对于Java而言，指的是同一个类型引用，在指向不同的具体对象时，运行时表现不同的行为
 *
 * 在多态当中,必须的场景是什么?
 *      1,继承
 *      2,方法的覆盖
 *      3,手动写代码,父类引用指向子类对象
 * 以上三点缺一不可
 *
 * 不能发生多态的场景:
 *      1,不能继承的类  final修饰的类,
 *      2,不能发生方法覆盖的方法 构造器,private修饰的方法,static修饰的方法,final修饰的方法
 *      3,手写代码保证
 *
 */
public class Demo {
    public static void main(String[] args) {
        //父类引用指向子类对象
        Animal a;
        a = new Cat();
        a.eat(); //猫吃鱼
        a = new Dog();
        a.eat(); //狗吃肉
    }
}

class Animal {
    public void eat() {
        System.out.println("吃饭!");
    }
}

class Cat extends Animal {
    @Override
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}